<?php
/**
 * 系统处理类
 * 
 * @version $Id: System.php 201 2011-06-20 06:54:46Z linsir123 $
 */
class lpSystem
{
	/**
	 * 系统错误类型
	 * 
	 * @var array
	 */
	static $__errors = array (
		E_ERROR => 'ERROR',
		E_WARNING => 'WARNING',
		E_PARSE => 'PARSING ERROR',
		E_NOTICE => 'NOTICE',
		E_CORE_ERROR => 'CORE ERROR',
		E_CORE_WARNING => 'CORE WARNING',
		E_COMPILE_ERROR => 'COMPILE ERROR',
		E_COMPILE_WARNING => 'COMPILE WARNING',
		E_USER_ERROR => 'USER ERROR',
		E_USER_WARNING => 'USER WARNING',
		E_USER_NOTICE => 'USER NOTICE',
		E_STRICT => 'STRICT NOTICE',
		E_RECOVERABLE_ERROR => 'RECOVERABLE ERROR',
	);
	
	/**
	 * 自定义错误处理，将这些报错的信息保存到缓存目录下
	 */
	static function errorHandler($num, $string, $file, $line, $context)
	{
		$type = array_key_exists($num, self::$__errors) ? self::$__errors[$num] : 'CAUGHT EXCEPTION';
		if (!in_array($num, array(E_NOTICE, E_STRICT, E_USER_NOTICE))) {
			$content = $type.': '.$string.' ['.$file.', '.$line.']';
			App::log($content, 'error/'.$type);
		}
	}
	
	/**
	 * 自定义异常处理
	 */
	static function exceptionHandler($exception)
	{
		try {
			switch ($exception->getCode()) {
				case 404:
					$file = 'miss';
					break;
					
				default:
					$file = 'debug';
					$content = '[Debug] '.$exception->getMessage().' ['.$exception->getFile(). ', '.$exception->getLine().']';
					App::log($content);
					break;
			}
			
			/// 调试模式下才进行显示
			if (APP_DEBUG) 
				require(CORE_DIR.'View/tpl/'.$file.'.php');
			
		} catch (Exception $e) {
			
			/// 默认处理
			error_log($e->getMessage(), 3, CACHE_DIR.'error_log');
		}
		
		App::end();
	}
	
	/**
	 * 输出字符集
	 */
	static function hCharset($charset, $type = 'text/html')
	{
		header("Content-Type:".$type.";charset=".$charset);
	}
	
	/**
	 * 输出无缓存头部
	 */
	static function hNocache()
	{
		header("Cache-Control: no-cache, must-ridate");
    	header("Pragma: no-cache");
	}
	
	/**
	 * 输出404，找不到页面
	 */
	static function h404()
	{
		header("HTTP/1.0 404 Not Found");
	}
	
	/**
	 * 输出304，找不到更新
	 * 
	 * 用于取得浏览器的$_SERVER['HTTP_IF_MODIFIED_SINCE']，
	 * 进行对比判断页面是否有更新，如果没则直接返回304输出
	 */
	static function h304()
	{
		/*
		// 以下代码为页面设置1天的缓存时间
		if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
			$timeLast = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']);
			$timeNow = time();
			if ($timeLast + 3600*24 > $timeNow) {
				header("HTTP/1.x 304 Not Modified");
				return false;
			}
		}
		header('Last-Modified:' . gmdate('D, d M Y' ).'GMT');
		*/
		
		header("HTTP/1.1 304 Not Modified");
	}
}
